package com.cloud.springcloudhysyrix.hebingqingqiu;

import com.netflix.hystrix.HystrixCollapser;
import com.netflix.hystrix.HystrixCollapserKey;
import com.netflix.hystrix.HystrixCollapserProperties;
import com.netflix.hystrix.HystrixCommand;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

/**
 *
 * 合并请求，并把响应，分别响应给每一个请求
 * 请求合并控制
 *
 * weiximei on 2018/6/1
 */

/**
 * HystrixCollapser<List<String>,String,Long>
 *      第一个参数表示合并之后返回的类型，第二个参数表示未合并返回的单个类型，第三个参数表示请求参数的类型
 */
public class WxmBatchCommand extends HystrixCollapser<List<String>,String,Long> {

    /**
     * 也就是把 List<Long> 拆开，分成一个个的Long
     */
    private Long id;

    private RestTemplate restTemplate;

//    public WxmBatchCommand(Setter setter, Long id, RestTemplate restTemplate) {
//        super(setter);
//        this.id = id;
//        this.restTemplate = restTemplate;
//    }

    public WxmBatchCommand(Long id, RestTemplate restTemplate) {
        // key 为了区分线程池
        // withTimerDelayInMilliseconds 表示合并的力度。也就是请求在200毫秒之内我就把请求合并掉。
        // 200毫秒，就意味着服务调用者要等待200毫秒，时间越大，服务调用者就等待的时候越长，因为我要等带请求的合并
        super(Setter.withCollapserKey(HystrixCollapserKey.Factory.asKey("wxmbatch"))
                .andCollapserPropertiesDefaults(HystrixCollapserProperties.Setter()
                        .withTimerDelayInMilliseconds(200)));
        this.id = id;
        this.restTemplate = restTemplate;
    }

    /**
     * 单个请求参数是什么类型
     * @return
     */
    @Override
    public Long getRequestArgument() {
        return id;
    }

    /**
     * 创建一个合并
     * @param collapsedRequests
     * @return
     */
    @Override
    protected HystrixCommand<List<String>> createCommand(Collection<CollapsedRequest<String, Long>> collapsedRequests) {
        // 初始化一个List
        List<Long> ids = new ArrayList<>(collapsedRequests.size());
        // CollapsedRequest::getArgument 表示 调用CollapsedRequest 类中 getArgument方法
        // getArgument 方法是获取元素
        ids.addAll(collapsedRequests.stream().map(CollapsedRequest::getArgument).collect(Collectors.toList()));

        // 创建合并请求类
        WxmCommand wxmCommand = new WxmCommand("weiximei",restTemplate,ids);

        return wxmCommand;
    }

    /**
     * 把结果，分发给每个相应的请求。
     *      就是每个请求，请求的到的什么都给他分别返回去。
     * @param batchResponse
     * @param collection
     */
    @Override
    protected void mapResponseToRequests(List<String> batchResponse, Collection<CollapsedRequest<String, Long>> collection) {

        System.out.println("分配批量请求结果。。。。");

        // 下坐标
        int count = 0;
        // 遍历 Collection<CollapsedRequest<String, Long>> collection
        for (CollapsedRequest<String,Long> collapsedRequest : collection){
            // 获取结果
            String result = batchResponse.get(count++);
            // 设置请求的结果
            collapsedRequest.setResponse(result);
        }



    }
}
